// Copyright 2010 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/bit-vector.h"

#include "src/base/bits.h"
#include "src/utils.h"

namespace v8 {
namespace internal {

#ifdef DEBUG
    void BitVector::Print()
    {
        bool first = true;
        PrintF("{");
        for (int i = 0; i < length(); i++) {
            if (Contains(i)) {
                if (!first)
                    PrintF(",");
                first = false;
                PrintF("%d", i);
            }
        }
        PrintF("}\n");
    }
#endif

    void BitVector::Iterator::Advance()
    {
        current_++;
        uintptr_t val = current_value_;
        while (val == 0) {
            current_index_++;
            if (Done())
                return;
            DCHECK(!target_->is_inline());
            val = target_->data_.ptr_[current_index_];
            current_ = current_index_ << kDataBitShift;
        }
        val = SkipZeroBytes(val);
        val = SkipZeroBits(val);
        current_value_ = val >> 1;
    }

    int BitVector::Count() const
    {
        if (data_length_ == 0) {
            return base::bits::CountPopulation(data_.inline_);
        } else {
            int count = 0;
            for (int i = 0; i < data_length_; i++) {
                count += base::bits::CountPopulation(data_.ptr_[i]);
            }
            return count;
        }
    }

} // namespace internal
} // namespace v8
